home *** CD-ROM | disk | FTP | other *** search
/ Hot Super Models / Hot Super Models.iso / unix / x11 / xv2r1.tar / xv2r1 / server / ddx / cfb32 / cfb8cppl.c < prev    next >
C/C++ Source or Header  |  1991-09-25  |  6KB  |  221 lines

  1. /*
  2.  * $XConsortium: cfb8cppl.c,v 1.5 91/08/22 15:41:05 keith Exp $
  3.  *
  4.  * Copyright 1990 Massachusetts Institute of Technology
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and its
  7.  * documentation for any purpose is hereby granted without fee, provided that
  8.  * the above copyright notice appear in all copies and that both that
  9.  * copyright notice and this permission notice appear in supporting
  10.  * documentation, and that the name of M.I.T. not be used in advertising or
  11.  * publicity pertaining to distribution of the software without specific,
  12.  * written prior permission.  M.I.T. makes no representations about the
  13.  * suitability of this software for any purpose.  It is provided "as is"
  14.  * without express or implied warranty.
  15.  *
  16.  * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  17.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
  18.  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  20.  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
  21.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  *
  23.  * Author:  Keith Packard, MIT X Consortium
  24.  */
  25.  
  26. /* 
  27.  * this is actually an mfb-specific function, except that
  28.  * it knows how to read from 8-bit cfb pixmaps.  Alas, this
  29.  * means that it doesn't know PPW so it is always compiled
  30.  */
  31.  
  32. #if PPW == 4
  33. #include "X.h"
  34. #include "Xmd.h"
  35. #include "gcstruct.h"
  36. #include "window.h"
  37. #include "pixmapstr.h"
  38. #include "scrnintstr.h"
  39. #include "windowstr.h"
  40. #include "cfb.h"
  41. #include "maskbits.h"
  42.  
  43. #include "mergerop.h"
  44.  
  45. #if BITMAP_BIT_ORDER == MSBFirst
  46. #define LeftMost    31
  47. #define StepBit(bit, inc)  ((bit) -= (inc))
  48. #else
  49. #define LeftMost    0
  50. #define StepBit(bit, inc)  ((bit) += (inc))
  51. #endif
  52.  
  53. #define GetBits(psrc, nBits, curBit, bitPos, bits) {\
  54.     bits = 0; \
  55.     while (nBits--) \
  56.     { \
  57.     bits |= ((*psrc++ >> bitPos) & 1) << curBit; \
  58.     StepBit (curBit, 1); \
  59.     } \
  60. }
  61.  
  62. cfbCopyImagePlane (pSrcDrawable, pDstDrawable, rop, prgnDst, pptSrc, planemask)
  63.     DrawablePtr pSrcDrawable;
  64.     DrawablePtr pDstDrawable;
  65.     int    rop;
  66.     unsigned long planemask;
  67.     RegionPtr prgnDst;
  68.     DDXPointPtr pptSrc;
  69. {
  70.     cfbCopyPlane8to1 (pSrcDrawable, pDstDrawable, rop, prgnDst, pptSrc,
  71.               (unsigned long) ~0L, planemask);
  72. }
  73.  
  74. cfbCopyPlane8to1 (pSrcDrawable, pDstDrawable, rop, prgnDst, pptSrc, planemask, bitPlane)
  75.     DrawablePtr pSrcDrawable;
  76.     DrawablePtr pDstDrawable;
  77.     int    rop;
  78.     RegionPtr prgnDst;
  79.     DDXPointPtr pptSrc;
  80.     unsigned long planemask;
  81.     unsigned long   bitPlane;
  82. {
  83.     int                srcx, srcy, dstx, dsty, width, height;
  84.     unsigned char        *psrcBase;
  85.     unsigned long        *pdstBase;
  86.     int                widthSrc, widthDst;
  87.     unsigned char        *psrcLine;
  88.     unsigned long        *pdstLine;
  89.     register unsigned char  *psrc;
  90.     register int        i;
  91.     register int        curBit;
  92.     register int        bitPos;
  93.     register unsigned long  bits;
  94.     register unsigned long  *pdst;
  95.     unsigned long        startmask, endmask;
  96.     int                niStart, niEnd;
  97.     int                bitStart, bitEnd;
  98.     int                nl, nlMiddle;
  99.     int                nbox;
  100.     BoxPtr            pbox;
  101.     MROP_DECLARE()
  102.  
  103.     if (!(planemask & 1))
  104.     return;
  105.  
  106.     if (rop != GXcopy)
  107.     MROP_INITIALIZE (rop, planemask);
  108.  
  109.     cfbGetByteWidthAndPointer (pSrcDrawable, widthSrc, psrcBase)
  110.  
  111.     mfbGetLongWidthAndPointer (pDstDrawable, widthDst, pdstBase)
  112.  
  113.     bitPos = ffs (bitPlane) - 1;
  114.  
  115.     nbox = REGION_NUM_RECTS(prgnDst);
  116.     pbox = REGION_RECTS(prgnDst);
  117.     while (nbox--)
  118.     {
  119.     dstx = pbox->x1;
  120.     dsty = pbox->y1;
  121.     srcx = pptSrc->x;
  122.     srcy = pptSrc->y;
  123.     width = pbox->x2 - pbox->x1;
  124.     height = pbox->y2 - pbox->y1;
  125.     pbox++;
  126.     pptSrc++;
  127.     psrcLine = psrcBase + srcy * widthSrc + srcx;
  128.     pdstLine = pdstBase + dsty * widthDst + (dstx >> 5);
  129.     dstx &= 0x1f;
  130.     if (dstx + width <= 32)
  131.     {
  132.         maskpartialbits(dstx, width, startmask);
  133.         nlMiddle = 0;
  134.         endmask = 0;
  135.     }
  136.     else
  137.     {
  138.         maskbits (dstx, width, startmask, endmask, nlMiddle);
  139.     }
  140.     if (startmask)
  141.     {
  142.         niStart = 32 - dstx;
  143.         bitStart = LeftMost;
  144.         StepBit (bitStart, dstx);
  145.     }
  146.     if (endmask)
  147.     {
  148.         niEnd = (dstx + width) & 0x1f;
  149.         bitEnd = LeftMost;
  150.     }
  151.     if (rop == GXcopy)
  152.     {
  153.         while (height--)
  154.         {
  155.             psrc = psrcLine;
  156.             pdst = pdstLine;
  157.             psrcLine += widthSrc;
  158.             pdstLine += widthDst;
  159.             if (startmask)
  160.             {
  161.             i = niStart;
  162.             curBit = bitStart;
  163.             GetBits (psrc, i, curBit, bitPos, bits);
  164.             *pdst = *pdst & ~startmask | bits;
  165.             pdst++;
  166.             }
  167.             nl = nlMiddle;
  168.             while (nl--)
  169.             {
  170.             i = 32;
  171.             curBit = LeftMost;
  172.             GetBits (psrc, i, curBit, bitPos, bits);
  173.             *pdst++ = bits;
  174.             }
  175.             if (endmask)
  176.             {
  177.             i = niEnd;
  178.             curBit = bitEnd;
  179.             GetBits (psrc, i, curBit, bitPos, bits);
  180.             *pdst = *pdst & ~endmask | bits;
  181.             }
  182.         }
  183.     }
  184.     else
  185.     {
  186.         while (height--)
  187.         {
  188.             psrc = psrcLine;
  189.             pdst = pdstLine;
  190.             psrcLine += widthSrc;
  191.             pdstLine += widthDst;
  192.             if (startmask)
  193.             {
  194.             i = niStart;
  195.             curBit = bitStart;
  196.             GetBits (psrc, i, curBit, bitPos, bits);
  197.             *pdst = MROP_MASK(bits, *pdst, startmask);
  198.             pdst++;
  199.             }
  200.             nl = nlMiddle;
  201.             while (nl--)
  202.             {
  203.             i = 32;
  204.             curBit = LeftMost;
  205.             GetBits (psrc, i, curBit, bitPos, bits);
  206.             *pdst = MROP_SOLID(bits, *pdst);
  207.             pdst++;
  208.             }
  209.             if (endmask)
  210.             {
  211.             i = niEnd;
  212.             curBit = bitEnd;
  213.             GetBits (psrc, i, curBit, bitPos, bits);
  214.             *pdst = MROP_MASK (bits, *pdst, endmask);
  215.             }
  216.         }
  217.     }
  218.     }
  219. }
  220. #endif
  221.